﻿using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Data;
using formworks.DBO;
using formworks.DBO.Core;


using Newtonsoft;
using Newtonsoft.Json;

namespace formworks
{
    /// <summary>
    /// 用户请求服务基本操作实现类
    /// 
    /// </summary>
    public class ActionBase<T> : IAction
    {
        /// <summary>
        /// 数据库工厂对象
        /// </summary>
        protected DBSessionFactory factory;
        /// <summary>
        /// 数据库会话对象
        /// </summary>
        protected DBSession session;
        /// <summary>
        /// 当前使用的实体列表变量
        /// </summary>
        protected List<T> dataList = null;
        /// <summary>
        /// 
        /// </summary>
        protected JavaScriptObject jsonObject;

        /// <summary>
        /// 初始化对象
        /// </summary>
        public ActionBase()
        {
            try
            {
                //通过配置获取数据库会话
                factory = new DBConfigure().buildSessionFactory();
                //打开一个数据库会话
                session = factory.openSession();

                jsonObject = new JavaScriptObject();
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        #region IAction 成员

        //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 根据用户请求构建查询语句
        /// <para>【可重写】用于构建复杂查询</para>
        /// </summary>
        /// <param name="request">用户http请求</param>
        /// <returns></returns>
        public virtual string constructQuerySQL(System.Web.HttpRequest request)
        {
            return "select * from " + typeof(T).Name;
        }
        /// <summary>
        /// 构建查询返回的数据串
        /// <para>【可重写】根据需要重写构建查询返回数据串的格式。</para>
        /// <para>传入：dataList ： List&lt；T&gt;</para>
        /// <para>返回：json 字符串</para>
        /// </summary>
        /// <param name="datatable">需要处理的DataTable</param>
        /// <returns>json 字符串 或者其他数据结构字符串</returns>
        public virtual string constructQueryData(DataTable datatable, System.Web.HttpRequest request)
        {
            
            return UnityToolkit.constructionTableGridJson(datatable);
        }

        protected int page;
        protected int rows;
        //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 默认版本：查询对象表中所有记录
        /// <para>接收数据：请求此方法即可</para>
        /// <para>返回数据：json字符串</para>
        /// </summary>
        /// <param name="request">用户http请求</param>
        /// <returns>json数据</returns>
        public virtual string Query(System.Web.HttpRequest request)
        {
            try
            {
                page = Convert.ToInt32(request.Params["page"]);
                rows = Convert.ToInt32(request.Params["rows"]);
                //构建查询字符串
                string sqlStr = constructQuerySQL(request);
                //查询并分页
                DataTable dt = UnityToolkit.paginationDataTable(page, rows, sqlStr, session);
                //Close Database Session
                session.closeSession();
                //构建json数据
                string outJson = constructQueryData(dt, request);
                //返回json数据到用户
                return outJson;
            }
            catch (System.Exception ex)
            {
                return exception(ex.Message);
            }
        }

        ////////////////////////////////////////////////////////////////////////////
        ///// <summary>
        ///// 委托构建查询的条件并返回一个SQL查询语句
        ///// </summary>
        ///// <param name="request">用户http请求</param>
        ///// <returns></returns>
        //public delegate string QuerySqlProcess(System.Web.HttpRequest request);

        ///// <summary>
        ///// 委托查询处理，接收查询出的DataTable 返回string
        ///// </summary>
        ///// <param name="datatable"></param>
        ///// <returns></returns>
        //public delegate string QueryProcess(DataTable datatable);



        ////////////////////////////////////////////////////////////////////////////
        ///// <summary>
        ///// 委托版本:查询对象表中所有记录
        ///// <para>接收数据：请求此方法即可</para>
        ///// <para>返回数据：json字符串</para>
        ///// </summary>
        ///// <param name="request">前台http请求</param>
        ///// <returns>json数据</returns>
        //public virtual string Query(System.Web.HttpRequest request, QuerySqlProcess querySqlProcess, QueryProcess queryProcess)
        //{
        //    try
        //    {
        //        page = Convert.ToInt32(request.Params["page"]);
        //        rows = Convert.ToInt32(request.Params["rows"]);

        //        //获取查询字符串
        //        string sqlStr = querySqlProcess(request);
        //        //查询并分页
        //        DataTable dt = ToolKit.paginationDataTable(page, rows, sqlStr, session);
        //        //Close Database Session
        //        session.closeSession();
        //        //获取处理后的Json或者其他数据结构
        //        string outData = queryProcess(dt);
        //        //返回数据给客户
        //        return outData;
        //    }
        //    catch (System.Exception ex)
        //    {
        //        return exception(ex.Message);
        //    }
        //}


        //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 添加操作时候触发的事件方法
        /// <para>重写克添加一些处理事件</para>
        /// </summary>
        public virtual void AddOperateEvent(T model)
        {
            //visaDetail.DID = Guid.NewGuid();
        }

        //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 添加记录，可以接收多条记录
        /// 接收数据：json字符串
        /// 返回数据：{state:success,col:1} or {state:fail}
        /// </summary>
        /// <param name="request">前台http请求</param>
        /// <returns>{state:success,col:1} or {state:fail}</returns>
        public virtual string Add(System.Web.HttpRequest request)
        {
            try
            {
                //获取数据json字符串
                string output = request.Params["CurrentEditData"];

                //T model = Activator.CreateInstance<T>();
                //从Json反序列化对象
                T model = (T)JavaScriptConvert.DeserializeObject(output, typeof(T));

                //处理添加其他附加事件
                AddOperateEvent(model);

                //添加到数据库
                int col = session.insert<T>(model);
                //关闭数据库会话
                session.closeSession();
                //返回操作是否成功
                refMsg(col);
            }
            catch (System.Exception ex)
            {
                return exception(ex.Message);
            }

            return "";
        }

        //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 修改操作，可修改多条
        /// 接收数据：json字符串
        /// 返回数据：{state:success,col:1} or {state:fail}
        /// </summary>
        /// <param name="request">前台http请求</param>
        /// <returns>{state:success,col:1} or {state:fail}</returns>
        public virtual string Modify(System.Web.HttpRequest request)
        {
            try
            {
                //获取数据json字符串
                string output = request.Params["CurrentEditData"];
                //从Json反序列化对象
                T model = (T)JavaScriptConvert.DeserializeObject(output, typeof(T));
                //更新到数据库
                int col = session.update<T>(model);
                //关闭数据库会话
                session.closeSession();
                //返回操作是否成功
                return refMsg(col);
            }
            catch (System.Exception ex)
            {
                return exception(ex.Message);
            }
        }

        //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 删除数据，以ID为标识
        /// 接收数据：数组字符串 例：id1,id3,id4
        /// 返回数据：{state:success,col:1} or {state:fail}
        /// </summary>
        /// <param name="request">前台http请求</param>
        /// <returns>{state:success,col:1} or {state:fail}</returns>
        public virtual string Remove(System.Web.HttpRequest request)
        {
            try
            {
                //获取要删除的ID
                string[] idArray = request.Params["IdArray"].Split(',');
                //删除指定ID的数据
                int col = session.deleteById<T>(idArray);
                //关闭数据库会话
                session.closeSession();
                //返回操作是否成功
                return refMsg(col);
            }
            catch (System.Exception ex)
            {
                return exception(ex.Message);
            }
        }




        //////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 通过数据库操作返回影响行数，
        /// 可根据需要重写消息返回的格式。
        /// 判定返回的消息
        /// 接收：影响行数
        /// 返回：{state:success,col:1} or {state:fail}
        /// </summary>
        /// <param name="col">影响行数</param>
        /// <returns></returns>
        public virtual string refMsg(int col)
        {
            jsonObject.Clear();

            if (col > 0)
            {

                jsonObject.Add("state", "success");
                jsonObject.Add("col", col);
                //返回状态为成功，并返数据库添加成功条数
                return JavaScriptConvert.SerializeObject(jsonObject);
                //return JsonBag._sbrace
                //    + JsonBag.format("state", "success")
                //    + JsonBag._comma
                //    + JsonBag.format("col", col)
                //    + JsonBag._ebrace;
            }
            else
            {
                jsonObject.Add("state", "failed");
                //返回状态为失败
                return JavaScriptConvert.SerializeObject(jsonObject);
                //return JsonBag._sbrace
                //    + JsonBag.format("state", "fail")
                //    + JsonBag._ebrace;
            }
        }

        public string exception(string msg)
        {
            jsonObject.Clear();
            jsonObject.Add("exception", msg);
            return JavaScriptConvert.SerializeObject(jsonObject);
        }

        #endregion


    }//end class
}//end namespace
